﻿using System;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using LAPI.Core;

namespace LAPI.Data.Model
{
    /// <summary>
    /// Modelo de la tabla 'Usuario'
    /// </summary>
    public class Usuario
    {
        #region Model
        //PK
        public int IdUsuario { get; set; }
        //FK
        public int IdPermisos { get; set; }

        public DateTime fx_registro { get; set; }

        //DATA
        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Nombre:")]
        [FieldValue("Nombre")]
        public String Nombre { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Apellidos:")]
        [FieldValue("Primer apellido")]
        public String Apellido { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Apellidos2")]
        [FieldValue("Segundo apellido")]
        public String Apellido2 { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "DNI:")]
        [FieldValue("DNI")]
        public String DNI { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Usuario:")]
        [FieldValue("Usuario")]
        public String User { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Contraseña:")]
        [FieldValue("Contraseña")]
        public String Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Repita la contraseña:")]
        [FieldValue("Repetición de la contraseña")]
        public string ConfirmPassword { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Nueva contraseña:")]
        [FieldValue("Nueva contraseña")]
        public string CambioPassword { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Dirección de correo:")]
        [FieldValue("Dirección de correo")]
        public String Email { get; set; }

        public Boolean activo { get; set; }
        #endregion 

        #region Data Helper
        public const String Table = "USUARIO";
        public const String Columns = "USUARIO.ID_USUARIO, Nombre, Apellido, Apellido2, DNI, Usuario, Password, FX_registro, ID_Permisos, Activo, Email";
        #endregion

        #region Insert Helper
        /// <summary>
        /// Crea la cadena con todas las columnas necesarias en una sentencia insert.
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToInsertColumns()
        {
            return "Nombre, Apellido, Apellido2, DNI, Usuario, Password, FX_registro, Email, ID_Permisos, Activo";
        }        
        
        /// <summary>
        /// Crea una cadena con todos los valores a insertar en una sentencia insert.
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToInsertValues()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("'");
            sentence.Append(this.Nombre);
            sentence.Append("','");
            sentence.Append(this.Apellido);
            sentence.Append("','");
            sentence.Append(this.Apellido2);
            sentence.Append("','");
            sentence.Append(this.DNI);
            sentence.Append("','");
            sentence.Append(this.User);
            sentence.Append("','");
            sentence.Append(this.Password);
            sentence.Append("','");
            sentence.Append(this.fx_registro);
            sentence.Append("','");
            sentence.Append(this.Email);
            sentence.Append("',");
            if (this.IdPermisos == null || this.IdPermisos == 0)
                sentence.Append(1); //default permiso
            else
                sentence.Append(this.IdPermisos);
            sentence.Append(",1"); //activo
            return sentence.ToString();
        }
        #endregion

        #region Update Helper 
        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>No actualiza todos los datos del modelo, sólo:
        /// <ul>
        /// <li>Nombre</li>
        /// <li>Apellido</li>
        /// <li>Apellido2</li>
        /// <li>DNI</li>
        /// <li>Email</li>
        /// </ul>
        /// </p>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdateDatosUsuario()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("Nombre = '");
            sentence.Append(this.Nombre);
            sentence.Append("', Apellido = '");
            sentence.Append(this.Apellido);
            sentence.Append("', Apellido2 = '");
            sentence.Append(this.Apellido2);
            sentence.Append("', DNI = '");
            sentence.Append(this.DNI);
            sentence.Append("', Email = '");
            sentence.Append(this.Email);
            sentence.Append("'");

            return sentence.ToString();
        }

        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>No actualiza todos los datos del modelo, sólo:
        /// <ul>
        /// <li>Password</li>
        /// </ul>
        /// </p>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdatePasswordUsuario()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("password = '");
            sentence.Append(this.Password);
            sentence.Append("'");

            return sentence.ToString();
        }

        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>Actualiza los siguientes datos del modelo:</p>
        /// <ul>
        /// <li>Activo</li>
        /// </ul>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdateEstado()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("Activo = '");
            sentence.Append(this.activo ? 1 : 0);
            sentence.Append("'");

            return sentence.ToString();
        }

        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>Actualiza los siguientes datos del modelo:</p>
        /// <ul>
        /// <li>Permiso</li>
        /// </ul>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdatePermiso()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("id_permisos = ");
            sentence.Append(this.IdPermisos);

            return sentence.ToString();
        }
        #endregion

        /// <summary>
        /// Método para convertir un Dataset en el modelo
        /// </summary>
        /// <param name="response">Dataset obtenido en una consulta</param>
        /// <returns>Colección con los modelos obtenidos en la conversión</returns>
        public static System.Collections.Generic.List<LAPI.Data.Model.Usuario> toModel(System.Data.DataSet response)
        {
            System.Collections.Generic.List<LAPI.Data.Model.Usuario> result = new System.Collections.Generic.List<Data.Model.Usuario>();

            foreach (System.Data.DataRow item in response.Tables[0].Rows)
            {
                LAPI.Data.Model.Usuario model = new Data.Model.Usuario();
                model.IdUsuario = Convert.ToInt32(item["ID_Usuario"]);
                model.IdPermisos = Convert.ToInt32(item["ID_Permisos"]);
                model.Nombre = item["Nombre"].ToString();
                model.Apellido = item["Apellido"].ToString();
                model.Apellido2 = item["Apellido2"].ToString();
                model.DNI = item["DNI"].ToString();
                model.User = item["Usuario"].ToString();
                model.Password = item["Password"].ToString();
                model.fx_registro = Convert.ToDateTime(item["fx_registro"].ToString());
                model.Email = item["email"].ToString();
                model.activo = Convert.ToBoolean(item["Activo"].ToString());

                result.Add(model);
            }

            return result;
        }

        public override String ToString()
        {
            return "[USUARIO]{IdUsuario:" + IdUsuario +
                ",IdPermisos:" + IdPermisos +
                ",Nombre:" + Nombre +
                ",Apellido:" + Apellido +
                ",Apellido2:" + Apellido2 +
                ",DNI:" + DNI +
                ",Usuario:" + User +
                ",Password:" + Password +
                ",fx_registro:" + fx_registro +
                ",Email:" + Email +
                "}";
        }
    }
}
